# -*- encoding: utf-8 -*-
############################################################################
#    Copyright (C) 2007-2010 by Håvard Gulldah                             #
#    havard@gulldahl.no                                                    #
#                                                                          #
#    This program is free software; you can redistribute it and#or modify  #
#    it under the terms of the GNU General Public License as published by  #
#    the Free Software Foundation; either version 2 of the License, or     #
#    (at your option) any later version.                                   #
#                                                                          #
#    This program is distributed in the hope that it will be useful,       #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#    GNU General Public License for more details.                          #
#                                                                          #
#    You should have received a copy of the GNU General Public License     #
#    along with this program; if not, write to the                         #
#    Free Software Foundation, Inc.,                                       #
#    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             #
############################################################################

import datetime
from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Postjournal(models.Model):
    uri = models.URLField()
    organisasjon = models.ForeignKey('Organisasjon')
    enkeltjournal_uri = models.URLField(blank=True)
    implisitt_enkeltjournal = models.BooleanField(default=True)
    bestill_uri = models.URLField(blank=True)
    fungerer = models.BooleanField(default=True)
    fjernet = models.BooleanField(default=False)
    stanset = models.BooleanField(default=False)
    etterslep = models.IntegerField(default=2) ## etterslep i journalføringen, i dager
    kommentar = models.TextField(blank=True)
    format = models.CharField(max_length=255, default=u'')
    class Meta:
        db_table = 'postjournal'
        verbose_name_plural = 'postjournaler'
    def __unicode__(self):
        return self.uri
    def bestillingsmetode(self):
        if '@' in self.bestill_uri:
            return "smtp"
        else:
            return "http"

class Postjournal_logg(models.Model):
    postjournal = models.ForeignKey(Postjournal)
    tidspunkt = models.DateTimeField()
    journaldato = models.DateField()
    req_uri = models.URLField()
    req_status = models.CharField(max_length=255, blank=True, null=True)
    req_details = models.CharField(max_length=255, blank=True, null=True)
    ferdig = models.BooleanField(default=False)
    class Meta:
        db_table = 'postjournal_logg'
        verbose_name_plural = 'postjournal-logger'
        verbose_name = 'postjournal-logg'
        get_latest_by = 'tidspunkt'
    def __unicode__(self):
        s = u''
        if self.tidspunkt is not None:
            s += self.tidspunkt.isoformat(" ") + ": "
        s += u'(%s) ' % unicode(self.id)
        s += self.req_status
        return s

class Postjournal_forslag(models.Model):
    ferdig_postjournal = models.ForeignKey(Postjournal, null=True)
    dato = models.DateTimeField(auto_now_add=True)
    bruker = models.ForeignKey(User, null=True)
    godtatt = models.DateTimeField(null=True)
    fjernet = models.DateTimeField(null=True)
    organisasjon = models.CharField(max_length=255)
    uri = models.URLField()
    detaljer = models.TextField()
    class Meta:
        db_table = 'postjournal_forslag'
        verbose_name_plural = 'postjournal-forslag'
        verbose_name = 'postjournal-forslag'
        get_latest_by = 'dato'
    def __unicode__(self):
        s = u''
        if self.bruker is not None:
            s += self.bruker + ': '
        s += self.organisasjon
        return s 

class Enkeltjournal(models.Model):
    uri = models.URLField()
    postjournal = models.ForeignKey(Postjournal)
    dato = models.DateField()
    class Meta:
        db_table = 'enkeltjournal'
        verbose_name_plural = 'enkeltjournaler'
        get_latest_by = 'dato'
    def __unicode__(self):
        return self.uri

    def ny_post(self):
        post = journalpost()
        post.enkeltjournal = self
        post.postjournal_id = self.postjournal_id
        return _store.add(post)
        #return post

class Adressat(models.Model):
    navn = models.CharField(max_length=255)
    uri = models.URLField()
    class Meta:
        db_table = 'adressat'
        verbose_name_plural = 'adressater'
    def __unicode__(self):
        return self.navn

class Organisasjon(models.Model):
    #TYPER = {'kommune':1, 'avdeling':2, 'fylke':3, 'etat':4}
    TYPER = (
       (1, 'kommune'),
       (2, 'avdeling'),
       (3, 'fylke'), 
       (4, 'etat')
    )
    navn = models.CharField(max_length=255)
    moder = models.ForeignKey('self')
    type = models.CharField(max_length=1, choices=TYPER)
    uri = models.URLField()
    class Meta:
        db_table = 'organisasjon'
        verbose_name_plural = 'organisasjoner'
    def __unicode__(self):
        return u"%s: %s (%s)" % (self.id, self.navn, self.get_type_display())

class Saksbehandler(models.Model):
    navn = models.CharField(max_length=255, default=u'')
    initialer = models.CharField(max_length=255, default=u'')
    epost = models.EmailField()
    uri = models.URLField()
    organisasjon = models.ForeignKey(Organisasjon)
    class Meta:
        db_table = 'saksbehandler'
        verbose_name_plural = 'saksbehandlere'
    def __unicode__(self):
        return self.navn

class Journalpost(models.Model):
    tittel = models.CharField(max_length=255)
    arkivsaksnr = models.CharField(max_length=255)
    dokumentnr = models.CharField(max_length=255)
    refnr = models.CharField(max_length=255) ## løpenummer
    adressat = models.ForeignKey(Adressat) # avsender/mottaker
    saksbehandler = models.ForeignKey(Saksbehandler)
    dokumentdato = models.DateField() # datetime.datetime or datetime.date instance ( or %Y-%m-%d ?)
    arkivdato = models.DateField()
    offentlig = models.BooleanField(default=True)
    uri = models.URLField()
    dok_uri = models.URLField()
    lovreferanse = models.CharField(max_length=255)
    RETNING = (
      (0, u'Ikke registrert'),
      (1, u'Inngående'),
      (2, u'Utgående'), 
      (3, u'N (ukjent)'), 
      (4, u'Saksfremlegg/innstilling'), 
      (5, u'X (ukjent)'),
    )
    retning = models.CharField(max_length=1, choices=RETNING, default=5) 
    # I: Inngående
    # U: Utgående
    # N: ??
    # S: Saksfremlegg/innstilling
    # X: ??
    sakskompleks = models.CharField(max_length=255)
    postjournal = models.ForeignKey(Postjournal)
    organisasjon = models.ForeignKey(Organisasjon)
    enkeltjournal = models.ForeignKey(Enkeltjournal)
    kommentar = models.TextField()
    class Meta:
        db_table = 'journalpost'
        verbose_name_plural = 'journalposter'
        get_latest_by = 'arkivdato'
        order_with_respect_to = 'enkeltjournal'
        ordering = ['sakskompleks','dokumentnr','arkivdato']
    def __unicode__(self):
        return u"#%s - %s" % (self.id, self.tittel)
    def dato(self):
        if self.dokumentdato is None:
            if self.arkivdato is not None:
                return self.arkivdato + " A"
            elif self.enkeltjournal.dato is not None:
                return self.enkeltjournal.dato + " J"
        return self.dokumentdato

class Feil(models.Model):
    tidspunkt = models.DateTimeField()
    uri = models.URLField()#Unicode()
    html = models.TextField()
    suppe = models.TextField()
    detaljer = models.TextField()
    postjournal = models.ForeignKey(Postjournal)
    class Meta:
        db_table = 'feil'
        verbose_name_plural = 'feil'
        get_latest_by = 'tidspunkt'
    def __unicode__(self):
        return self.tidspunkt.isoformat()

class Nyhet(models.Model):
    publisert = models.DateTimeField()
    tekst = models.TextField()
    aktiv = models.BooleanField(default=True)
    tittel = models.CharField(max_length=50)
    slug = models.SlugField(max_length=25)
    class Meta:
        db_table = 'nyhet'
        verbose_name_plural = 'nyheter'
        get_latest_by = 'publisert'
    def __unicode__(self):
        return self.slug

#class Nyhetskategori(models.Model):
        
class Interessant(models.Model):
    journalpost = models.ForeignKey(Journalpost)
    flagget = models.DateTimeField()
    sjekket = models.DateTimeField()
    flagget_av = models.ForeignKey(User)
    respons = models.FloatField()
    kommentar = models.TextField()
    class Meta:
        db_table = 'interessant'
        verbose_name_plural = 'interessant'
        get_latest_by = 'flagget'
        
class Agent(models.Model):
    bruker = models.ForeignKey(User)
    tekst  = models.CharField(max_length=255)
    dato   = models.DateTimeField(auto_now_add=True)
    lest   = models.PositiveIntegerField(default=0)
    kommentar = models.TextField()
    inaktiv = models.DateTimeField()
    class Meta:
        db_table = 'agent'
        verbose_name_plural = 'agenter'
        get_latest_by = 'dato'
    def __unicode__(self):
        return u"%s: /%s/" % (self.bruker, self.tekst)
    def er_aktiv(self):
        return self.inaktiv == datetime.datetime(0)
    
class Innsyn(models.Model):
    bruker = models.ForeignKey(User)
    journalpost = models.ForeignKey(Journalpost)
    registrert = models.DateTimeField(auto_now_add=True)    
    sendt = models.DateTimeField(null=True)
    lovreferanse = models.CharField(max_length=255)
    kommentar = models.TextField()
    STATUS = (
        ('registrert', u'Registrert'),
        ('sendt', u'Sendt'),
        ('mottatt', u'Dokumentet er mottatt, innsyn ble godkjent'),
        ('avslag', u'Begjæring om innsyn ble avslått')
    )
    status = models.CharField(choices=STATUS, default='registrert', max_length=16)
    class Meta:
        db_table = 'innsyn'
        verbose_name_plural = 'innsyn'
        get_latest_by = 'registrert'
    def __unicode__(self):
        return "%s: %s" % (self.registrert, self.journalpost.id)

class Sok(models.Model):
    bruker = models.ForeignKey(User)
    tekst = models.CharField(max_length=255)
    registrert = models.DateTimeField(auto_now_add=True)
    treff = models.IntegerField()
    class Meta:
        db_table = 'sok'
        verbose_name = 'søk'
        verbose_name_plural = 'søk'
        get_latest_by = 'registrert'
    def __unicode__(self):
        return "%s: %s" % (self.registrert, self.tekst)

